//package com.ruoyi.framework.handler;
//
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
//import com.ruoyi.common.entity.LoginUser;
//import com.ruoyi.common.entity.system.SysRole;
//import com.ruoyi.common.util.ServletUtils;
//import com.ruoyi.common.util.bean.SpringUtils;
//import com.ruoyi.framework.service.TokenService;
//import lombok.SneakyThrows;
//import lombok.extern.slf4j.Slf4j;
//import net.sf.jsqlparser.expression.Expression;
//import net.sf.jsqlparser.expression.HexValue;
//import net.sf.jsqlparser.expression.LongValue;
//import net.sf.jsqlparser.expression.StringValue;
//import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
//import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
//import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
//import net.sf.jsqlparser.expression.operators.relational.InExpression;
//import net.sf.jsqlparser.expression.operators.relational.ItemsList;
//import net.sf.jsqlparser.schema.Column;
//import org.omg.SendingContext.RunTime;
//import org.springframework.util.CollectionUtils;
//
//import java.util.Arrays;
//import java.util.List;
//import java.util.Objects;
//import java.util.Set;
//import java.util.stream.Collectors;
//
///**
// * @author LiuXiaoYu
// */
//@Slf4j
//public class MybatisPlusDataPermissionHandler implements DataPermissionHandler {
//
//    /**
//     * 全部数据权限
//     */
//    public static final String DATA_SCOPE_ALL = "1";
//
//    /**
//     * 自定数据权限
//     */
//    public static final String DATA_SCOPE_CUSTOM = "2";
//
//    /**
//     * 部门数据权限
//     */
//    public static final String DATA_SCOPE_DEPT = "3";
//
//    /**
//     * 部门及以下数据权限
//     */
//    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
//
//    /**
//     * 仅本人数据权限
//     */
//    public static final String DATA_SCOPE_SELF = "5";
//
//    /**
//     * 数据权限过滤关键字
//     */
//    public static final String DATA_SCOPE = "dataScope";
//    /**
//     * 父级部门分隔符
//     */
//    private static final String DEPT_DELIMETER = ",";
//
//
//
//    /**
//     * @param where             原SQL Where 条件表达式
//     * @param mappedStatementId Mapper接口方法ID
//     * @return
//     */
//    @SneakyThrows
//    @Override
//    public Expression getSqlSegment(Expression where, String mappedStatementId) {
//
//        // TODO 暂时哪些要做过滤
//        if (!StrUtil.contains(mappedStatementId, "ExtLeaveMapper")) {
//            return where;
//        }
//        try {
//            // 1. 获取权限过滤相关信息
//            LoginUser loginUser=SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
//            if (Objects.isNull(loginUser)) {
//                return where;
//            }
//            if (!CollectionUtils.isEmpty(loginUser.getUser().getRoles())){
//                return where;
//            }
//            log.info("开始进行权限过滤,dataFilterMetaData:{} , where: {},mappedStatementId: {}", loginUser, where, mappedStatementId);
//            Expression expression = new HexValue(" 1 = 1 ");
//            if (Objects.isNull(where)) {
//                where = expression;
//            }
//
//            for (SysRole sysRole:loginUser.getUser().getRoles()){
//                switch (sysRole.getDataScope()) {
//                    // 查看全部
//                    case DATA_SCOPE_ALL:
//                        return where;
//                    // 查看本人所在组织机构以及下属机构
//                    case DATA_SCOPE_DEPT_AND_CHILD:
//                        // 创建IN 表达式
//                        // 创建IN范围的元素集合
//                        //TODO 查看本部门以及下属部门
//                        String ancestors = loginUser.getUser().getDept().getAncestors();
//                        String[] split = ancestors.split(DEPT_DELIMETER);
//                        //	List<String>转List<Long>
//                        Set<Long>  deptIds= Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toSet());
//                        // 把集合转变为JSQLParser需要的元素列表
//                        ItemsList itemsList = new ExpressionList(deptIds.stream()
//                                .map(LongValue::new).collect(Collectors.toList()));
//                        InExpression inExpression = new InExpression(new Column("dept_id"), itemsList);
//                        return new AndExpression(where, inExpression);
//                    // 查看当前部门的数据
//                    case DATA_SCOPE_DEPT:
//                        //  = 表达式
//                        // dept_id = deptId
//                        EqualsTo equalsTo = new EqualsTo();
//                        equalsTo.setLeftExpression(new Column("dept_id"));
//                        equalsTo.setRightExpression(new LongValue(loginUser.getUser().getDept().getDeptId()));
//                        // 创建 AND 表达式 拼接Where 和 = 表达式
//                        // WHERE xxx AND dept_id = 3
//                        return new AndExpression(where, equalsTo);
//                    // 查看自己的数据
//                    case DATA_SCOPE_SELF:
//                        // create_by = userId
//                        EqualsTo selfEqualsTo = new EqualsTo();
//                        selfEqualsTo.setLeftExpression(new Column("user_id"));
//                        selfEqualsTo.setRightExpression(new LongValue(loginUser.getUser().getUserId()));
//                        return new AndExpression(where, selfEqualsTo);
//                    case DATA_SCOPE_CUSTOM:
//                        //TODO 自定义
////                        return new AndExpression(where, new StringValue(userInfoAndPowers.getSql()));
//                    default:
//                        break;
//                }
//            }
//
//        } catch (Exception e) {
//            throw new RuntimeException("数据权限发生异常", e);
//        }
//        return where;
//    }
//}
